import { getToken } from '@/utils/auth'
import store from '@/store'

// 登录页面
const loginPage = "/pages/login"
  
// 页面白名单
const whiteList = [
  '/pages/login', 
  '/pages/register', 
  '/pages/common/webview/index',
  '/pages/common/textview/index'
]

// 基础页面（不需要权限）
const basicPages = [
  '/pages/index',           // 首页
  '/pages/work/index',      // 工作台
  '/pages/mine/index',      // 我的页面
  '/pages/mine/info/index', // 个人信息
  '/pages/mine/setting/index', // 应用设置
  '/pages/mine/help/index', // 帮助中心
  '/pages/mine/about/index', // 关于我们
  '/pages/mine/avatar/index', // 修改头像
  '/pages/mine/info/edit',  // 编辑资料
  '/pages/mine/pwd/index',  // 修改密码
  '/pages/common/webview/index', // 网页浏览
  '/pages/common/textview/index', // 文本浏览
  //'/pages/app/inbound/index' // 入库管理页面
]



// 检查地址白名单
function checkWhite(url) {
  const path = url.split('?')[0]
  return whiteList.indexOf(path) !== -1
}

// 检查页面是否是基础页面（不需要权限）
function isBasicPage(path) {
  return basicPages.includes(path)
}

// 检查页面是否在白名单中
function isWhiteListPage(path) {
  return whiteList.includes(path)
}

// 将移动端路径转换为后端路径格式（用于匹配）
function convertMobilePathToBackendPath(mobilePath) {
  // 移除 /pages/ 前缀和 /index 后缀
  // 例如: /pages/app/inbound/index -> /app/inbound
  if (mobilePath.startsWith('/pages/')) {
    let backendPath = mobilePath.replace('/pages/', '/')
    if (backendPath.endsWith('/index')) {
      backendPath = backendPath.replace('/index', '')
    }
    return backendPath
  }
  return mobilePath
}

// 根据 route.component 生成可能的移动端路径
function generatePossibleMobilePaths(route) {
  const paths = []
  
  if (route.path) {
    // 直接路径匹配
    paths.push(route.path)
    // 将后端路径转换为移动端路径格式
    // 例如: /app/inbound -> /pages/app/inbound/index
    if (route.path.startsWith('/')) {
      const pathWithoutSlash = route.path.substring(1) // 移除开头的 /
      paths.push(`/pages/${pathWithoutSlash}/index`)
      paths.push(`/pages/${pathWithoutSlash}`)
    } else {
      paths.push(`/pages/${route.path}/index`)
      paths.push(`/pages/${route.path}`)
    }
  }
  
  if (route.component) {
    const componentPath = route.component.replace(/^\//, '')
    // 处理 app/inbound 这样的路径
    if (componentPath.includes('/')) {
      paths.push(`/pages/${componentPath}/index`)
      paths.push(`/pages/${componentPath}`)
    } else {
      paths.push(`/pages/${componentPath}/index`)
    }
  }
  
  return paths
}

// 检查路由权限
function hasRoutePermission(routePath, userRouters = null) {
  // 检查用户权限
  const userPermissions = store.getters.permissions || []
  
  // 检查是否有超级管理员权限
  if (userPermissions.includes('*:*:*')) {
    console.log('用户拥有超级管理员权限，允许访问所有页面')
    return true
  }
  
  if (!userRouters) {
    // 使用 backendRouters，因为它是真正的路由对象数组（包含 path、component 等）
    // routers 可能是权限数组或其他格式，不可靠
    userRouters = store.getters.backendRouters || []
  }
  
  if (!userRouters || userRouters.length === 0) {
    console.log('路由权限检查: 无用户路由数据，路径:', routePath)
    return false
  }
  
  // 将移动端路径转换为后端路径格式
  const backendPath = convertMobilePathToBackendPath(routePath)
  
  // 检查是否在用户路由列表中
  const hasPermission = userRouters.some(route => {
    // 直接路径匹配
    if (route.path === routePath || route.path === backendPath) {
      return true
    }
    
    // 通过 component 生成的路径匹配
    const possiblePaths = generatePossibleMobilePaths(route)
    if (possiblePaths.includes(routePath)) {
      return true
    }
    
    // 递归检查子路由
    if (route.children && route.children.length > 0) {
      return hasRoutePermission(routePath, route.children)
    }
    return false
  })
  
  if (!hasPermission) {
    console.log('路由权限检查失败:', { routePath, backendPath, userRoutersCount: userRouters.length })
  }
  
  return hasPermission
}

// 检查路由权限
function checkRoutePermission(url) {
  const path = url.split('?')[0]
  
  // 白名单页面直接通过
  if (isWhiteListPage(path)) {
    return true
  }
  
  // 基础页面直接通过（不需要权限）
  if (isBasicPage(path)) {
    return true
  }
  
  // 对于其他页面，检查用户是否有该路由的访问权限
  // 使用 backendRouters，因为它是真正的路由对象数组
  const userRouters = store.getters.backendRouters || []
  return hasRoutePermission(path, userRouters)
}

// 页面跳转验证拦截器
let list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"]
list.forEach(item => {
  uni.addInterceptor(item, {
    invoke(to) {
      if (getToken()) {
        if (to.url === loginPage) {
          uni.reLaunch({ url: "/" })
        }
        // 检查路由权限  关闭路径拦截 采用点击事件触发是否拦截，不然每个页面包括子页面都需要配白名单拦截
        // if (checkRoutePermission(to.url)) {
        //   return true
        // } else {
        //   uni.showToast({
        //     title: '无权限访问该页面',
        //     icon: 'none'
        //   })
        //   return false
        // }
      } else {
        if (checkWhite(to.url)) {
          return true
        }
        uni.reLaunch({ url: loginPage })
        return false
      }
    },
    fail(err) {
      console.log(err)
    }
  })
})
